#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/stat.h>

// 测试用例1：文件锁冲突
void test_file_lock() {
    int fd = open("testfile", O_CREAT | O_RDWR, 0666);
    struct flock lock = {F_WRLCK, SEEK_SET, 0, 0, 0};
    
    // 父进程设置写锁
    if (fcntl(fd, F_SETLK, &lock) == -1) {
        perror("Parent set lock failed");
        exit(1);
    }
    printf("[Parent] 已设置写锁\n");

    pid_t pid = fork();
    if (pid == 0) { // 子进程
        lock.l_type = F_RDLCK;
        if (fcntl(fd, F_SETLK, &lock) == -1) {
            printf("[Child] 读锁申请失败 (预期结果，errno=%d)\n", errno);
        }
        exit(0);
    }

    wait(NULL); // 等待子进程结束
    lock.l_type = F_UNLCK;
    fcntl(fd, F_SETLK, &lock);
    close(fd);
}

// 测试用例2：非阻塞模式
void test_nonblocking() {
    int fd = open("testfile", O_CREAT | O_RDWR, 0666);
    
    // 获取并设置非阻塞标志
    int flags = fcntl(fd, F_GETFL);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
    
    char buf[10];
    ssize_t bytes = read(fd, buf, sizeof(buf));
    if (bytes == -1 && errno == EAGAIN) {
        printf("非阻塞读取成功触发 EAGAIN\n");
    }
    close(fd);
}

// 测试用例3：文件描述符复制
void test_dup_fd() {
    int fd1 = open("testfile", O_CREAT | O_RDWR, 0666);
    int fd2 = fcntl(fd1, F_DUPFD, 0);
    
    printf("原始FD: %d, 复制FD: %d\n", fd1, fd2);
    close(fd1);
    close(fd2);
}

int main() {
    printf("=== 测试1：文件锁冲突 ===\n");
    test_file_lock();
    
    printf("\n=== 测试2：非阻塞模式 ===\n");
    test_nonblocking();
    
    printf("\n=== 测试3：FD复制 ===\n");
    test_dup_fd();
    
    return 0;
}